package com.jxb.myshop.web.servlet;

import com.jxb.myshop.common.Constant;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            // 获取地址栏中的method属性
            String method = req.getParameter("method");
            System.out.println(method);
            // 通过对象实例获取类对象   <? extends BaseController>泛型中的就是？代表本类与本类的子类
            Class<? extends BaseController> aClass = this.getClass();
            // 通过类对象获取方法（方法名，参数列表）
            Method method1 = aClass.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
//            System.out.println(method1);
            // 实例化方法，相当于new一个对象.方法，后面是方法的参数
            String result = (String) method1.invoke(this, req, resp);
            // 判断这个方法的返回值是否为空
            if (result != null) {
                if (result.startsWith(Constant.Re.URL_FORWARD)) {
                    // 如果返回值开头是forward: 那么他就是转发，执行转发的操作
                    System.out.println("这是转发");
                    req.getRequestDispatcher(result.replace(Constant.Re.URL_FORWARD, "")).forward(req,resp);
                }else if(result.startsWith(Constant.Re.URL_REDIRECT)){
                    // 如果返回值开头是redirect: 那么他就是转发，执行重定向的操作
                    System.out.println("这是重定向");
                    resp.sendRedirect(result.replace(Constant.Re.URL_REDIRECT,""));
                }else {
                    // 既不是转发也不是重定向那就是通过json写入页面
                    System.out.println("这是写出字符串");
                    resp.getWriter().println(result);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            // 如果没找到方法就响应404页面给用户进行提示
            resp.sendRedirect("/error.jsp");
        }
    }
}
